#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

// 获取当前时间（微秒级精度）
long long get_current_time() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (long long)tv.tv_sec * 1000000 + tv.tv_usec;
}

int main() {
    const int SIZE = 10000; // 定义大矩阵的大小
    const int MAX_VALUE = 100; // 随机数的最大值
    
    // 动态分配大矩阵
    int **matrix1 = (int **)malloc(SIZE * sizeof(int *));
    int **matrix2 = (int **)malloc(SIZE * sizeof(int *));
    int **res1 = (int **)malloc(SIZE * sizeof(int *));
    int **res2 = (int **)malloc(SIZE * sizeof(int *));
    
    for(int i = 0; i < SIZE; i++) {
        matrix1[i] = (int *)malloc(SIZE * sizeof(int));
        matrix2[i] = (int *)malloc(SIZE * sizeof(int));
        res1[i] = (int *)malloc(SIZE * sizeof(int));
        res2[i] = (int *)malloc(SIZE * sizeof(int));
    }
    
    // 设置随机数种子
    srand((unsigned int)time(NULL));
    
    printf("正在生成 %dx%d 的随机矩阵...\n", SIZE, SIZE);
    
    // 用随机数填充矩阵
    for(int i = 0; i < SIZE; i++) {
        for(int j = 0; j < SIZE; j++) {
            matrix1[i][j] = rand() % MAX_VALUE + 1;
            matrix2[i][j] = rand() % MAX_VALUE + 1;
        }
    }
    
    printf("矩阵生成完成，开始性能测试...\n");
    
    long long start1, end1, start2, end2;
    double duration1, duration2;
    
    // 记录行遍历开始时间
    start1 = get_current_time();
    
    // 以遍历行的形式相加
    for(int i = 0; i < SIZE; i++) {
        for(int j = 0; j < SIZE; j++) {
            res1[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }
    
    // 记录行遍历结束时间
    end1 = get_current_time();
    duration1 = (double)(end1 - start1) / 1000.0; // 转换为毫秒
    
    // 记录列遍历开始时间
    start2 = get_current_time();
    
    // 以遍历列的形式相加
    for(int i = 0; i < SIZE; i++) {
        for(int j = 0; j < SIZE; j++) {
            res2[j][i] = matrix1[j][i] + matrix2[j][i];
        }
    }
    
    // 记录列遍历结束时间
    end2 = get_current_time();
    duration2 = (double)(end2 - start2) / 1000.0; // 转换为毫秒
    
    // 输出结果
    printf("行遍历时间: %.2f 毫秒\n", duration1);
    printf("列遍历时间: %.2f 毫秒\n", duration2);
    printf("时间比(行遍历/列遍历): %.2f\n", duration1/duration2);
    
    
    // 释放动态分配的内存
    for(int i = 0; i < SIZE; i++) {
        free(matrix1[i]);
        free(matrix2[i]);
        free(res1[i]);
        free(res2[i]);
    }
    free(matrix1);
    free(matrix2);
    free(res1);
    free(res2);
    //从输出结果看，按行读取比按列读取快得多
    return 0;
}